﻿/**
 * @file SEAShellWapper.h
 * @brief SEA板 相关的python接口
 * @author wangning (2185896382@qq.com)
 * @date 2024-11-25
 */
#ifndef _PY_SEA_SHELL_WAPPER_H___
#define _PY_SEA_SHELL_WAPPER_H___
 
#include <QString>
#include <QObject>
#include "PythonInterfaceAPI.h"
#include "FITK_Component/FITKAcousticsModel/PyFITKSEAShell.h"


class SEAShell : public Acoustics::PyFITKSEAShell
{
public:
    explicit SEAShell(const QString& name);
    explicit SEAShell();
    virtual ~SEAShell() = default;

};

/**
 * @brief SEA板 相关的python接口
 * @author wangning (2185896382@qq.com)
 * @date 2024-11-25
 */
class  PythonInterfaceAPI SEAShellWapper : public QObject
{
    Q_OBJECT
public slots:
    SEAShell* new_SEAShell();

    void delete_SEAShell(SEAShell* obj);
    /**
     * @brief 在Python解释器中通过名称获取对象
     * @author wangning (2185896382@qq.com)
     * @date 2024-12-03
     */
    SEAShell* static_SEAShell_GetSEAShell(const QString& name);
    /**
     * @brief 添加点
     * @param[i]  pointId：点的ID
     * @param[i]  type：点的类型 1,         ///< 起点
                                 2,          ///< 路径上的点 (中间点)
                                 3,        ///< 拐点
                                 4,        ///< 终点
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    void addPoint(SEAShell* obj, int pointId/*, int type*/);
    /**
     * @brief 创建板
     * @param[i]  type：板的类型 1为平板，2为单曲率板，3为双曲率板
     * @param[i]  numRing：双曲率板的层数, 平板和单曲率板不需要设置该参数
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    void createShell(SEAShell* obj, int type,int numRing = 0);
    /**
     * @brief 设置阻尼,只要调用该函数自动开启阻尼
     * @param[i]  type   1:flexure
                         2:extension
                         3:shear
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    void setDamping(SEAShell* obj, int type, const QString& damping = QString());
    /**
     * @brief 关闭阻尼,只有板有这个函数
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    void closeDamping(SEAShell* obj);
    /**
     * @brief 设置声学包
     * @param[i]  NCT：1内部声学包，2外部声学包
     * @param[i]  Covered：覆盖率
     * @param[i]  NTCtype：声学包种类
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    void setNCT(SEAShell* obj,int NCT, double Covered, const QString& NCTtypeName =QString());
    /**
     * @brief 设置物理属性
     * @param[i]  prop：物理属性
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    void setPhysicalProp(SEAShell* obj, const QString& prop);
    /**
     * @brief 获取名称
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    QString getName(SEAShell* obj);
    /**
     * @brief 设置名称
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-22
     */
    void setName(SEAShell* obj, const QString& name);
    /**
     * @brief 设置有效辐射尺寸放大倍数
     * @param[i]  area：面积放大倍数
     * @param[i]  perimeter：周长放大倍数
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-25
     */
    void setEffRadiationDimensions(SEAShell* obj, double area,double perimeter);
    /**
     * @brief 设置是否启用 弯曲波，拉伸波，剪切波  在SEA的解决方案 
              设置是否启用 弯曲波，拉伸波，剪切波  的模态密度及启用类型
     * @param[i]  type：波的类型 1:弯曲波 2:拉伸波 3:剪切波
     * @param[i]  isSolution：是否启用波在SEA的解决方案 
     * @param[i]  isModalDensity：是否启用波的模态密度
     * @param[i]  modalDensity：模态密度类型
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-25
     */
    void setSEAMatrixSolution_ModalDensity(SEAShell* obj, int type,bool isSolution,bool isModalDensity, const QString& modalDensity = QString());  
    /**
     * @brief 设置弯曲波对分层面板的校正状态
     * @param[i]  is：是否启用
     * @param[i]  length：长放大倍数
     * @param[i]  width：宽放大倍数
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-25
     */
    void setFlexureCorrectionSDP(SEAShell* obj,bool is,double length = -1,double width = -1);
    /**
     * @brief 设置 From Noise Control Treatments Damping
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-25
     */
    void setDampingFromNCT(SEAShell* obj,bool is);
    /**
     * @brief 设置 From Physical Property
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-25
     */
    void setDampingFromPhyProp(SEAShell* obj, bool is);
    /**
     * @brief 获取周长和面积
     * @author wangning (2185896382@qq.com)
     * @date 2024-11-25
     */
    QString getGeometryProp(SEAShell* obj);

private:
    void initShell(SEAShell* shell);
};

#endif
